package com.atguigu.msm.service.impl;

import com.alibaba.fastjson.JSONObject;
import com.aliyuncs.CommonRequest;
import com.aliyuncs.CommonResponse;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.http.MethodType;
import com.aliyuncs.profile.DefaultProfile;
import com.atguigu.commonutils.JwtUtils;
import com.atguigu.msm.service.MsmService;
import com.atguigu.msm.utils.RandomUtil;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import com.tencentcloudapi.common.Credential;
import com.tencentcloudapi.common.exception.TencentCloudSDKException;
//导入可选配置类
import com.tencentcloudapi.common.profile.ClientProfile;
import com.tencentcloudapi.common.profile.HttpProfile;
// 导入对应SMS模块的client
import com.tencentcloudapi.sms.v20210111.SmsClient;
// 导入要请求接口对应的request response类
import com.tencentcloudapi.sms.v20210111.models.SendSmsRequest;
import com.tencentcloudapi.sms.v20210111.models.SendSmsResponse;

import com.github.qcloudsms.SmsSingleSender;
import com.github.qcloudsms.SmsSingleSenderResult;
import com.github.qcloudsms.httpclient.HTTPException;
import org.json.JSONException;
import java.io.IOException;

import java.util.Map;

@Service
public class MsmServiceImpl implements MsmService {
//    @Value("tengcent.secretId")
    private String secretId = "AKIDhDUVFiyyhALFsEJ8gwve6HBoeEXZLq40";
//    @Value("tengcent.secretKey")
    private String secretKey = "g5D4dwyiCOJxKQFn32lDOJyMSHp66oFP";
    @Override
    public boolean sendTencent(Map<String, Object> param, String phone) {
//        try {
//            /* 必要步骤：
//             * 实例化一个认证对象，入参需要传入腾讯云账户密钥对secretId，secretKey。
//             * 这里采用的是从环境变量读取的方式，需要在环境变量中先设置这两个值。
//             * 你也可以直接在代码中写死密钥对，但是小心不要将代码复制、上传或者分享给他人，
//             * 以免泄露密钥对危及你的财产安全。
//             * CAM密匙查询: https://console.cloud.tencent.com/cam/capi*/
//            Credential cred = new Credential(secretId, secretKey);
//            // 实例化一个http选项，可选，没有特殊需求可以跳过
//            HttpProfile httpProfile = new HttpProfile();
//            // 设置代理
//            // httpProfile.setProxyHost("真实代理ip");
//            // httpProfile.setProxyPort(真实代理端口);
//            /* SDK默认使用POST方法。
//             * 如果你一定要使用GET方法，可以在这里设置。GET方法无法处理一些较大的请求 */
//            httpProfile.setReqMethod("POST");
//            /* SDK有默认的超时时间，非必要请不要进行调整
//             * 如有需要请在代码中查阅以获取最新的默认值 */
//            httpProfile.setConnTimeout(60);
//            /* SDK会自动指定域名。通常是不需要特地指定域名的，但是如果你访问的是金融区的服务
//             * 则必须手动指定域名，例如sms的上海金融区域名： sms.ap-shanghai-fsi.tencentcloudapi.com */
//            httpProfile.setEndpoint("sms.tencentcloudapi.com");
//            /* 非必要步骤:
//             * 实例化一个客户端配置对象，可以指定超时时间等配置 */
//            ClientProfile clientProfile = new ClientProfile();
//            /* SDK默认用TC3-HMAC-SHA256进行签名
//             * 非必要请不要修改这个字段 */
//            clientProfile.setSignMethod("HmacSHA256");
//            clientProfile.setHttpProfile(httpProfile);
//            /* 实例化要请求产品(以sms为例)的client对象
//             * 第二个参数是地域信息，可以直接填写字符串ap-guangzhou，或者引用预设的常量 */
//            SmsClient client = new SmsClient(cred, "ap-guangzhou", clientProfile);
//            /* 实例化一个请求对象，根据调用的接口和实际情况，可以进一步设置请求参数
//             * 你可以直接查询SDK源码确定接口有哪些属性可以设置
//             * 属性可能是基本类型，也可能引用了另一个数据结构
//             * 推荐使用IDE进行开发，可以方便的跳转查阅各个接口和数据结构的文档说明 */
//            SendSmsRequest req = new SendSmsRequest();
//            /* 填充请求参数,这里request对象的成员变量即对应接口的入参
//             * 你可以通过官网接口文档或跳转到request对象的定义处查看请求参数的定义
//             * 基本类型的设置:
//             * 帮助链接：
//             * 短信控制台: https://console.cloud.tencent.com/smsv2
//             * sms helper: https://cloud.tencent.com/document/product/382/3773 */
//            /* 短信应用ID: 短信SdkAppId在 [短信控制台] 添加应用后生成的实际SdkAppId，示例如1400006666 */
//            String sdkAppId = "1400565455";
//            req.setSmsSdkAppId(sdkAppId);
//            /* 短信签名内容: 使用 UTF-8 编码，必须填写已审核通过的签名，签名信息可登录 [短信控制台] 查看 */
//            String signName = "pingpongpeng";
//            req.setSignName(signName);
//            /* 国际/港澳台短信 SenderId: 国内短信填空，默认未开通，如需开通请联系 [sms helper] */
////            String senderid = "";
////            req.setSenderId(senderid);
//            /* 用户的 session 内容: 可以携带用户侧 ID 等上下文信息，server 会原样返回 */
////            String sessionContext = "xxx";
////            req.setSessionContext(sessionContext);
//            /* 短信号码扩展号: 默认未开通，如需开通请联系 [sms helper] */
//            String extendCode = "";
//            req.setExtendCode(extendCode);
//            /* 模板 ID: 必须填写已审核通过的模板 ID。模板ID可登录 [短信控制台] 查看 */
//            String templateId = "1094692";
//            req.setTemplateId(templateId);
//            /* 下发手机号码，采用 E.164 标准，+[国家或地区码][手机号]
//             * 示例如：+8613711112222， 其中前面有一个+号 ，86为国家码，13711112222为手机号，最多不要超过200个手机号 */
//            String[] phoneNumberSet = {"+86"+phone};
//            req.setPhoneNumberSet(phoneNumberSet);
//            /* 模板参数: 若无模板参数，则设置为空 */
//            String[] templateParamSet = {"5678"};
//            req.setTemplateParamSet(templateParamSet);
//            /* 通过 client 对象调用 SendSms 方法发起请求。注意请求方法名与请求对象是对应的
//             * 返回的 res 是一个 SendSmsResponse 类的实例，与请求对象对应 */
//            SendSmsResponse res = client.SendSms(req);
//            // 输出json格式的字符串回包
////            System.out.println(SendSmsResponse.toJsonString(res));
//            // 也可以取出单个值，你可以通过官网接口文档或跳转到response对象的定义处查看返回字段的定义
////            System.out.println(res.getRequestId());
//            String requestId = res.getRequestId();
//            if(StringUtils.isEmpty(requestId))
//                return false;
//            return true;
//        } catch (TencentCloudSDKException e) {
//            e.printStackTrace();
//            return false;
//        }

        // 短信应用 SDK AppID
        int appid = 1400565455; // SDK AppID 以1400开头
        // 短信应用 SDK AppKey
        String appkey = "efd5c71684ad736c87c33c2d2fa06d3b";
        // 需要发送短信的手机号码
        String[] phoneNumbers = {phone};
        // 短信模板 ID，需要在短信应用中申请
        int templateId = 1094692; // NOTE: 这里的模板 ID`7839`只是示例，真实的模板 ID 需要在短信控制台中申请
        // 签名
        String smsSign = "pingpongpeng"; // NOTE: 签名参数使用的是`签名内容`，而不是`签名ID`。这里的签名"腾讯云"只是示例，真实的签名需要在短信控制台申请

        try {
            //TODO
            String[] params = {(String) param.get("code"), (String) param.get("expired")};//和你的模板参数要对应上
//            String[] params ={"4568","2"};
                    SmsSingleSender ssender = new SmsSingleSender(appid, appkey);
            SmsSingleSenderResult result = ssender.sendWithParam("86", phoneNumbers[0],
                    templateId, params, smsSign, "", "");
            System.out.println(result);
        } catch (HTTPException e) {
            // HTTP 响应码错误
            e.printStackTrace();
        } catch (JSONException e) {
            // JSON 解析错误
            e.printStackTrace();
        } catch (IOException e) {
            // 网络 IO 错误
            e.printStackTrace();
        }

        return true;

    }

//    @Override
//    public boolean send(Map<String, Object> param, String phone) {
//
//        if(StringUtils.isEmpty(phone)) return false;
//
//        DefaultProfile profile =
//                DefaultProfile.getProfile("default", "LTAI5tGvNVFF7syZPqwAuWD4", "VVPNHrUYnAOlzCLkFM8EtAkggE7SDc");
//        IAcsClient client = new DefaultAcsClient(profile);
//
//        //设置相关固定的参数
//        CommonRequest request = new CommonRequest();
//        //request.setProtocol(ProtocolType.HTTPS);
//        request.setSysMethod(MethodType.POST);
//        request.setSysDomain("dysmsapi.aliyuncs.com");
//        request.setSysVersion("2017-05-25");
//        request.setSysAction("SendSms");
//
//        //设置发送相关的参数
//        request.putQueryParameter("PhoneNumbers",phone); //手机号
//        request.putQueryParameter("SignName","我的xmall购物商城"); //申请阿里云 签名名称
//        request.putQueryParameter("TemplateCode",""); //申请阿里云 模板code
//        request.putQueryParameter("TemplateParam", JSONObject.toJSONString(param)); //验证码数据，转换json数据传递
//
//        try {
//            //最终发送
//            CommonResponse response = client.getCommonResponse(request);
//            boolean success = response.getHttpResponse().isSuccess();
//            return success;
//        }catch(Exception e) {
//            e.printStackTrace();
//            return false;
//        }
//    }


}

